package com.yupi.springbootinit.statemachine.rule.impl;

import com.yupi.springbootinit.statemachine.core.StateContext;
import com.yupi.springbootinit.statemachine.rule.BusinessRule;
import com.yupi.springbootinit.statemachine.rule.RuleValidationResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 订单业务规则实现
 * 包含订单状态转换的各种业务规则
 */
@Slf4j
@Component
public class OrderBusinessRules {
    
    /**
     * 订单创建规则：检查订单基本信息完整性
     */
    public static class OrderCreationRule implements BusinessRule {
        
        @Override
        public String getRuleName() {
            return "ORDER_CREATION_RULE";
        }
        
        @Override
        public String getDescription() {
            return "验证订单创建时的基本信息完整性";
        }
        
        @Override
        public RuleValidationResult validate(StateContext context) {
            // 检查订单基本信息
            Object orderData = context.getParameter("orderData", Object.class);
            if (orderData == null) {
                return RuleValidationResult.failure("订单数据不能为空", "ORDER_DATA_NULL");
            }
            
            // 这里可以添加更多具体的验证逻辑
            // 例如：检查产品料号、数量、交付日期等必填字段
            
            log.debug("订单创建规则验证通过: {}", context.getEntityId());
            return RuleValidationResult.success();
        }
        
        @Override
        public int getPriority() {
            return 10; // 高优先级
        }
    }
    
    /**
     * 工艺发布前置条件规则
     */
    public static class ProcessSheetPublishRule implements BusinessRule {
        
        @Override
        public String getRuleName() {
            return "PROCESS_SHEET_PUBLISH_RULE";
        }
        
        @Override
        public String getDescription() {
            return "验证工艺单发布前的前置条件";
        }
        
        @Override
        public RuleValidationResult validate(StateContext context) {
            // 检查是否存在有效的工艺单
            Long orderId = context.getEntityId();
            
            // 模拟检查工艺单是否存在且完整
            // 实际应用中应该查询数据库
            if (orderId == null || orderId <= 0) {
                return RuleValidationResult.failure("无效的订单ID", "INVALID_ORDER_ID");
            }
            
            // 检查工艺单是否包含必要的工序信息
            // 这里可以添加具体的工艺单完整性检查逻辑
            
            log.debug("工艺发布规则验证通过: {}", orderId);
            return RuleValidationResult.success();
        }
        
        @Override
        public int getPriority() {
            return 20;
        }
    }
    
    /**
     * 生产排期发布规则
     */
    public static class ProductionScheduleRule implements BusinessRule {
        
        @Override
        public String getRuleName() {
            return "PRODUCTION_SCHEDULE_RULE";
        }
        
        @Override
        public String getDescription() {
            return "验证生产排期发布的前置条件";
        }
        
        @Override
        public RuleValidationResult validate(StateContext context) {
            // 检查工艺单是否已发布
            // 检查资源是否可用
            // 检查排期时间是否合理
            
            Long orderId = context.getEntityId();
            if (orderId == null) {
                return RuleValidationResult.failure("订单ID不能为空", "ORDER_ID_NULL");
            }
            
            // 模拟检查工艺单状态
            // 实际应用中应该查询工艺单状态
            
            log.debug("生产排期规则验证通过: {}", orderId);
            return RuleValidationResult.success();
        }
        
        @Override
        public int getPriority() {
            return 30;
        }
    }
    
    /**
     * 订单完成规则
     */
    public static class OrderCompletionRule implements BusinessRule {
        
        @Override
        public String getRuleName() {
            return "ORDER_COMPLETION_RULE";
        }
        
        @Override
        public String getDescription() {
            return "验证订单完成的条件";
        }
        
        @Override
        public RuleValidationResult validate(StateContext context) {
            // 检查所有工序是否完成
            // 检查所有必要的检验是否通过
            // 检查是否有未处理的质量问题
            
            Long orderId = context.getEntityId();
            
            // 模拟检查所有工序完成状态
            // 实际应用中应该查询工序实例状态
            
            // 模拟检查质检状态
            // 实际应用中应该查询质检任务状态
            
            log.debug("订单完成规则验证通过: {}", orderId);
            return RuleValidationResult.success();
        }
        
        @Override
        public int getPriority() {
            return 40;
        }
    }
}